package com.define.commons.common.enums;

/**
 * Http请求响应状态码
 * @Author xiewenlong
 * @Date 2018/11/9 11:05
 */
public enum HttpStatus {

    /**
     * 操作成功！
     * 表示请求已成功，请求所希望的响应头或数据体将随此响应返回
     */
    OK(200, "OK"),

    /**
     * 请求已创建！
     * 表示请求成功并且服务器创建了新的资源，且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话，应当返回 '202 Accepted'
     */
    CREATED(201, "Created"),

    /**
     * 请求已接受，等待处理！
     * 服务器已接受请求，但尚未处理
     */
    ACCEPTED(202, "Accepted"),

    /**
     * 您请求的资源已被移动到新的地方！
     * 被请求的资源已永久移动到新位置。服务器返回此响应（对 GET 或 HEAD 请求的响应）时，会自动将请求者转到新位置。
     */
    MOVED_PERMANENTLY(301, "Moved Permanently"),

    /**
     * 您的请求有多个响应！
     * 请求的资源临时从不同的URI响应请求，但请求者应继续使用原有位置来进行以后的请求
     */
    FOUND(302, "Found"),

    /**
     * 您请求的资源未被修改过！
     * 自从上次请求后，请求的网页未修改过。服务器返回此响应时，不会返回网页内容。 如果网页自请求者上次请求后再也没有更改过，您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。
     */
    NOT_MODIFIED(304, "Not Modified"),

    /**
     * 请求无效
     */
    BAD_REQUEST(400, "Bad Request"),

    /**
     * 请您进行身份验证！
     * 请求要求身份验证。 对于需要登录的网页，服务器可能返回此响应。
     */
    UNAUTHORIZED(401, "Unauthorized"),

    /**
     * 您没有权限执行此操作！
     * 服务器已经理解请求，但是拒绝执行它。与401响应不同的是，身份验证并不能提供任何帮助，而且这个请求也不应该被重复提交。
     */
    FORBIDDEN(403, "Forbidden"),

    /**
     * 资源不存在！
     * 请求失败，请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。
     * 假如服务器知道情况的话，应当使用410状态码来告知旧资源因为某些内部的配置机制问题，已经永久的不可用，而且没有任何可以跳转的地址。
     * 404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
     */
    NOT_FOUND(404, "Not Found"),

    /**
     * 系统错误！
     * 服务器遇到了一个未曾预料的状况，导致了它无法完成对请求的处理。一般来说，这个问题都会在服务器的程序码出错时出现。
     */
    ERROR(500, "Internal Server Error"),

    /**
     * 服务器当前无法处理请求!
     * 由于临时的服务器维护或者过载，服务器当前无法处理请求。通常，这个是暂时状态，一段时间会恢复
     */
    SERVICE_UNAVAILABLE(503, "Service Unavailable");

    private Integer code;
    private String msg;
    HttpStatus(Integer code, String msg){
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     *  根据状态码获取消息
     *   1**	信息，服务器收到请求，需要请求者继续执行操作
     *   2**	成功，操作被成功接收并处理
     *   3**	重定向，需要进一步的操作以完成请求
     *   4**	客户端错误，请求包含语法错误或无法完成请求
     *   5**	服务器错误，服务器在处理请求的过程中发生了错误
     */
    public static String getMsgByCode(Integer code){
        for (HttpStatus httpStatus:HttpStatus.values()){
            if(httpStatus.getCode().equals(code)){
                return httpStatus.getMsg();
            }
        }
        if(code >= 100 && code < 200) return "服务器收到请求，需要请求者继续执行操作!";
        else if(code >= 200 && code < 300) return "操作成功!";
        else if(code >= 300 && code < 400) return "已重定向，需要进一步的操作以完成请求!";
        else if(code >= 400 && code < 500) return "客户端错误!";
        else if(code >= 500 && code < 600) return "服务器错误!";
        return "发生未知错误！";
    }
}
